<?php

namespace longhu\library;

use PhpAmqpLib\Message\AMQPMessage;

class SimpleMQProduce extends SimpleMQBase
{
    public function fanout($type,$data)
    {
        $config  = $this->getConfigDefail($type);
        $config['queue_name'] = $config['queue_name'].'_'.env('domain.app_id');
        $config['exchange_name'] = $config['exchange_name'].'_'.env('domain.app_id');

        $messageBody = json_encode($data);

        $connection = $this->connectRabbitMQ();

        //连接管道
        $channel = $connection->channel();
        //推送成功
        $channel->set_ack_handler(function (AMQPMessage $message)use ($messageBody) {

        });

        $channel->confirm_select();
        //初始化交换机
        $channel->exchange_declare($config['exchange_name'], $config['exchange_type'], false, true, false);
        //申明队列
        /**
         * 关于 queue_declare参数的说明
         * params  queue  队列的名称
         * params  passive 是否消极的声明队列，如果存在，就把队列的信息返回， 如果没有就抛出错误，（是的， 你没看错，这个参数很鸡肋，所以一般为 false）
         * params  durable 是否持久化，意思是说就算队列服务挂了， 也不会丢失队列
         * params  exclusive  是否排外，如果设置为true ,表示只有本次连接中的channel 可以访问，其它channel 是不可以访问的
         * params  auto_delete  设置是否自动删除。为true 则设置队列为自动删除。自动删除的前提是, 至少有一个消费者连接到这个队列，之后所有与这个队列连接的消费者都断开时，才会自动删除
         * params  nowait 相当于做一个异步版的声明， 如果设置成true, 就是说方法调用完就结束，也不用等待创建队列是否成功，一般也设为false
         */
        $channel->queue_declare($config['queue_name'], false, true, false, false);

        //绑定队列与交换机
        $channel->queue_bind($config['queue_name'], $config['exchange_name'], $config['route_key']);
        $msg = new AMQPMessage($messageBody,[
            "delivery_mode"=>AMQPMessage::DELIVERY_MODE_PERSISTENT          //使消息持久化
        ]);
        $channel->basic_publish($msg, $config['exchange_name'], $config['route_key']);
        $channel->wait_for_pending_acks();
        $channel->close();
        $connection->close();

    }

    public function success(AMQPMessage $message,$body)
    {

    }



}